// 引入axios
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import qs from 'qs'

// 设置一个请求拦截器，减少每此url的书写量
function getBaseURL (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagou.com'
  } else {
    return 'http://edufront.lagou.com'
  }
}

// 自定义新建一个axios实例
const request = axios.create({})

request.interceptors.request.use(function (config) {
  // 根据url判断地址，设置给config.baseURl
  config.baseURL = getBaseURL(config.url)

  // 设置Token
  const { user } = store.state
  if (user && user.access_token) {
    // 设置Token
    config.headers.Authorization = user.access_token
  }
  return config
})

// axios响应拦截器
// request.interceptors.response.use(function (response) {
//   // 状态码 2xx 进入这个分支
//   console.log(response)
//   return response
// }, function (err) {
//   // 出错信息进入这个分值
//   console.dir(err)
//   return Promise.reject(err)
// })

// 是否正在更新token
let isRefreshing = false

// 设置响应拦截器
request.interceptors.response.use(function (response) {
  // 状态码为 2xx 都会进入这里
  return response
}, function (error) {
  // 超出 2xx 都会进入这里
  if (error.response) {
    // 请求发送成功，也收到了响应，到状态码超过了2xx（常见错误处理位置）
    // 1. 保存状态码
    const {
      status
    } = error.response
    // 2. 判断
    let errorMessage = ''
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // token 无效
      // 1检测：如果store不存在user，跳转至登录页
      if (!store.state.user) {
        this.$router.push({
          name: 'login',
          query: {
            // router.currentRoute 获取当前路由对应的信息
            lastUrl: router.currentRoute.fullPath
          }
        })
        // 阻止后续操作
        return Promise.reject(error)
      }
      // 发送前检查是否有其他更新token，如果有，则return
      if (isRefreshing) {
        return
      }
      // 如果没有，则更新isrefreshtoken为true，表示正在更新token
      isRefreshing = true
      // 2.如果有user，啧根据refresh_token请求新的access_token
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // 检测，是否请求到新的token
        console.log(res)
        // 1.没有新的token
        if (res.data.state !== 1) {
          // 清除无效的用户信息
          store.commit('setUser', null)
          // 跳转至登录页
          this.$router.push({
            name: 'login',
            query: {
              lastUrl: router.currentRoute.fullPath
            }
          })
          // 组织向下传递
          return Promise.reject(error)
        }
        // 2.成功获取新的token
        store.commit('setUser', res.data.content)
        // 从新请求上次错误的接口
        return request(error.config)
      }).catch(() => {
        // 如果出现错误，清除用户信息，并跳转至重新登陆
        store.commit('setUser', null)
        router.push({
          name: 'login',
          query: {
            lastUrl: router.currentRoute.fullPath
          }
        }).finally(() => {
          isRefreshing = false
        })
      })
    } else if (status === 403) {
      errorMessage = '没有权限，请联系管理员'
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status >= 500) {
      errorMessage = '服务端错误，请联系管理员'
    }
    this.$message.error(errorMessage)
  } else if (error.request) {
    // 请求发送成功，但没有收到响应
    this.$message.error('请求超时，请重试')
  } else {
    // 在设置请求时发生了一些失去，触发了错误（未知型错误）
    this.$message.error(`请求失败${error.message}`)
  }
  // 将请i失败的错误对象继续抛出，传递给接收响应的处理函数
  return Promise.reject(error)
})

export default request
